/**
 * Copyright ©2003~2019年3月12日 szkingdom
 * @author raohj
 * @date 2019年3月12日
 * @file RFileSystem.java
 * @comment : please input your comment to this file
 * @version : input version
 * @modify:
 * 		1、 2019年3月12日 由 raohj 新建文件
 */
package com.ccnu.demojava.fileio;

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Date;
import java.util.Properties;
import java.util.Random;

/**
 * @author raohj
 * @date 2019年3月12日
 * @version
 * @comment to add your comment
 */
public class RFileSystem {
	private static final long GB = 1073741824L;

	/**
	 * @author raohj
	 * @date 2019年3月18日
	 * @comment 目录测试
	 * @param 
	 * @return 
	 */
	public static void dirOpr() {
		FileSystem fs = FileSystems.getDefault();

		// 磁盘空间操作
		for (FileStore fspace : fs.getFileStores()) {
			try {
				System.out.println("磁盘名称:" + fspace.name() + "|磁盘类型:" + fspace.type() + "|磁盘空间:"
						+ fspace.getTotalSpace() / GB + "|可用空间:" + fspace.getUsableSpace() / GB + "|未分配空间:"
						+ fspace.getUnallocatedSpace() / GB);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		// 路径操作
		String currDir = System.getProperty("user.dir");
		System.out.println("current directory:" + currDir);

		String separator = System.getProperty("file.separator");
		System.out.println("file separator:" + separator);

		String homeDir = System.getProperty("user.home");
		System.out.println("home directory:" + homeDir);

		// 显示系统的所有变量
		Properties prots = System.getProperties();
		prots.list(System.out);

		// 显示某一个路径下的所有目录和文件
		System.out.println("===============遍历目录D:\\work========开始=========");
		TraverseDir(fs.getPath("D:", "work"));
		System.out.println("===============遍历目录D:\\work========结束=========");

		// 检查一个文件或目录是否存在
		Path tDir = fs.getPath("D:", "update");
		System.out.println("是否存在目录D:\\update = " + Files.exists(tDir));

		// 判断是否是可执行文件
		Path tExecuteFile = fs.getPath("D:", "Software", "kjseunpack.exe");
		System.out.println(tExecuteFile.getFileName() + "|" + tExecuteFile.isAbsolute() + "|"
				+ tExecuteFile.getNameCount() + "是否是可执行程序 = " + Files.isExecutable(tExecuteFile));
		
		// 测试Path对象的目录结构
		System.out.println(tExecuteFile.getRoot().getFileName());
		System.out.println(tExecuteFile.getParent().getFileName());
		for(int i=0; i<tExecuteFile.getNameCount(); i++) {
			System.out.println(tExecuteFile.getName(i).getFileName());
		}
		
		// 创建目录
		System.out.println("===============测试目录创建=================");
		Random rd = new Random(new Date().getTime());
		Integer iT = rd.nextInt();
		Path createDir = Paths.get("D:", "temp", "tmp", iT.toString());
		try {
			Files.createDirectory(createDir);		// 创建目录
			System.out.println("单目录创建 = " + Files.exists(createDir));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Integer d1 = rd.nextInt();
		Integer d2 = rd.nextInt();
		Path createDirs = Paths.get("D:", "temp", "tmp", d1.toString(),d2.toString());
		try {
			Files.createDirectories(createDirs);	// 创建多层目录
			System.out.println("多层目录创建" + createDirs.getParent().getFileName() + "/" +  createDirs.getFileName() + " = " + Files.exists(createDirs));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		System.out.println("===============测试文件创建=================");
		Integer d3 = rd.nextInt();
		Path createF = Paths.get("D:", "temp", "tmp", d3.toString());
		try {
			Files.createFile(createF);
			System.out.println("文件创建" + createF.getFileName() +" = " + Files.exists(createF));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
//		System.out.println("===============遍历目录=================");
		
		
//		for(Path p : fs.getRootDirectories()) {
//			Path root = p.getRoot();
//			root.getFileName().
//			System.out.println(p.getFileName());
//		}
	}

	/**
	 * @author raohj
	 * @date 2019年3月18日
	 * @comment 遍历目录
	 * @param
	 * @return
	 * @param pt
	 */
	public static void TraverseDir(Path pt) {
		DirectoryStream<Path> pathContents = null;

		try {
			pathContents = Files.newDirectoryStream(pt);
			for (Path path : pathContents) {
				// 获取路径的属性
				BasicFileAttributes attr = Files.readAttributes(path, BasicFileAttributes.class);
				if (attr.isDirectory()) {
					System.out.println("directory:" + path.getFileName());
//					TraverseDir(path);
				} else {
					System.out.println("file:" + path.getFileName());
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (pathContents != null) {
				try {
					pathContents.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
